package pe.com.empresa.web.actions;

import java.util.List;
import pe.com.empresa.datos.dominio.ConsultaRolesPorUsuario;
import pe.com.empresa.datos.dominio.ConsultarPermisosPorRol;
import pe.com.empresa.datos.dominio.PersonaNatural;
import pe.com.empresa.datos.dominio.Usuario;
import pe.com.empresa.servicios.businessdelegate.SeguridadBusinessDelegate;
import pe.com.empresa.servicios.servicio.IniciarSesionService;
import pe.com.empresa.utiles.ActionHelper;
import pe.com.empresa.utiles.Constantes;


public class AutenticacionAction extends ActionHelper {

	private static final long serialVersionUID = -7125274097566527100L;
	private Usuario usuario; 
	private List<ConsultaRolesPorUsuario> roles;
	private IniciarSesionService service = new SeguridadBusinessDelegate().getIniciarSesionService();
	private Integer idRol;
	 
	public String execute() throws Exception {

		//Obtenemos una instancia del sqlSessionFactory
		service.setSqlSessionFactory(this.getSqlSessionFactory());
		//abrimos la conexion
		service.openSession();
		
		Usuario usuarioValidado = service.validarUsuario(usuario);
		String result=ERROR;
		
		if(usuarioValidado != null){
			
			this.getSessionContext().setAttribute(Constantes.SESION_USUARIO, usuarioValidado);
			PersonaNatural persona = service.obtenerPersona(usuarioValidado.getIdUsuario());
			this.getSessionContext().setAttribute(Constantes.SESION_PERSONA, persona);
			roles = service.consultarRoles(usuarioValidado.getIdUsuario());
			this.getSessionContext().setAttribute(Constantes.SESION_ROLES, roles);
			
			if(roles.size() == 1){
				
				result = SUCCESS;
				idRol = roles.get(0).getIdRol();
				this.cargarPermisosEnSession();
				ConsultaRolesPorUsuario rol = this.buscarRol(idRol,roles);
				System.out.println("Rol obtenido: "+rol.toString());
				if(rol != null){
					this.getSessionContext().setAttribute(Constantes.SESION_ROL, rol);
					System.out.println("Guarda rol: "+rol.toString());
					ConsultaRolesPorUsuario rol2 = (ConsultaRolesPorUsuario) this.getSessionContext().getAttribute(Constantes.SESION_ROL);
					System.out.println("Rol guardado en sesion:" + rol2);
				}
				
			}else{
				result = "selectRol";
			}
			
		}
		
		//Cerramos la conexion
		service.closeSession();
		return result;

	}
	
	@SuppressWarnings("unchecked")
	public String cargarRol() throws Exception{
		
		if(idRol == -1){
			
			return ERROR;
			
		}else{
			
			if(this.validarInicioSesion()){
				System.out.println("Ya tiene un rol seleccionado");
				this.getSessionContext().removeAttribute(Constantes.SESION_ROL);
			}
			
			service.setSqlSessionFactory(this.getSqlSessionFactory());
			service.openSession();
			
			this.cargarPermisosEnSession();
			List<ConsultaRolesPorUsuario> roles = (List<ConsultaRolesPorUsuario>) this.getSessionContext().getAttribute(Constantes.SESION_ROLES);
			ConsultaRolesPorUsuario rol = this.buscarRol(idRol,roles);
			
			if(rol != null){
				
				this.getSessionContext().setAttribute(Constantes.SESION_ROL, rol);
				System.out.println("Guardo rol");
				
			}

			
			service.closeSession();
			return SUCCESS;
			
		}
		

	}

	public String seleccionarRol() throws Exception{
		return SUCCESS;
	}	
	
	public void cargarPermisosEnSession() throws Exception{
		List<ConsultarPermisosPorRol> permisos = service.consultarPermisos(idRol);		
		this.getSessionContext().setAttribute(Constantes.SESION_PERMISOS, permisos);
	}
	
	private ConsultaRolesPorUsuario buscarRol(Integer id,List<ConsultaRolesPorUsuario> roles){
		System.out.println("id enviado: "+id);
		for(ConsultaRolesPorUsuario rol : roles){
			System.out.println("id iterado: "+rol.getIdRol().intValue());
			if(rol.getIdRol().intValue() == id.intValue()){
				return rol;
			}
		}
		return null;
	}
	
	public String cerrarSesion(){
		
		this.getSessionContext().removeAttribute(Constantes.SESION_USUARIO);
		this.getSessionContext().removeAttribute(Constantes.SESION_PERSONA);
		this.getSessionContext().removeAttribute(Constantes.SESION_ROL);
		this.getSessionContext().removeAttribute(Constantes.SESION_ROLES);
		this.getSessionContext().removeAttribute(Constantes.SESION_PERMISOS);
		
		this.getSessionContext().invalidate();
		
		return SUCCESS;
	}

	public Usuario getUsuario() {
		return usuario;
	}
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public List<ConsultaRolesPorUsuario> getRoles() {
		return roles;
	}

	public void setRoles(List<ConsultaRolesPorUsuario> roles) {
		this.roles = roles;
	}

	public IniciarSesionService getService() {
		return service;
	}

	public void setService(IniciarSesionService service) {
		this.service = service;
	}

	public Integer getIdRol() {
		return idRol;
	}

	public void setIdRol(Integer idRol) {
		this.idRol = idRol;
	}
	
}
